package main

import (
	"io"
	"log"
	"os"
)

func CopyFileByChunks(src, dst string, chunkSize int64) (err error) {
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()
	
	dstFile, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer dstFile.Close()
	
	info, err := srcFile.Stat()
	if err != nil {
		return err
	}
	
	var size = info.Size()
	if chunkSize <= 0 || chunkSize > size {
		chunkSize = size
	}
	
	buf := make([]byte, chunkSize)
	for {
		n, err := srcFile.Read(buf)
		if n == 0 {
			break
		}
		if err != nil && err != io.EOF {
			return err
		}
		
		if _, err := dstFile.Write(buf[:n]); err != nil {
			return err
		}
	}
	srcFile.Close()
	if err := os.Remove(src); err != nil {
		return err
	}
	log.Println("重命名文件src：", src)
	return os.Rename(dst, src)
}

//安全地重命名大文件
func RenameLargeFile(oldPath, newPath string) error {
	// 打开源文件
	srcFile, err := os.Open(oldPath)
	if err != nil {
		return err
	}
	defer srcFile.Close()
	
	// 创建目标文件
	dstFile, err := os.Create(newPath)
	if err != nil {
		return err
	}
	defer dstFile.Close()
	
	// 复制内容
	_, err = io.Copy(dstFile, srcFile)
	if err != nil {
		return err
	}
	
	// 同步缓冲区
	err = dstFile.Sync()
	if err != nil {
		return err
	}
	
	// 删除源文件
	srcFile.Close()
	err = os.Remove(oldPath)
	if err != nil {
		return err
	}
	return nil
}

func main() {
	src := "sskLogtemp_file.txt"
	dst := "sskRename.txt"
	//chunkSize := int64(1024 * 1024) // 1MB chunks
	//err := CopyFileByChunks(src, dst, chunkSize)
	err := RenameLargeFile(src, dst)
	if err != nil {
		log.Println("重命名文件报错：", err)
		//panic(err)
	}
}
